/**
  @file     	Profession.h 
  @brief    	all kinds of Profession
  @author  	arvin
  @version 	1.0   2012/12/13
 */

#ifndef CXX_PROFESSION_H
#define CXX_PROFESSION_H
#include "ProductDef.h"

class Profession
{
public:
	/**
	* Destruction
	*
	* @param VOID
	* @return 
	*/
    virtual ~Profession() = 0;

	/**
	* Operation
	*
	* @param VOID
	* @return 
	*/
	virtual VOID Operation() = 0;

	/**
	* Operation
	*
	* @param VOID
	* @return PROFESSION_TYPE
	*/
	PROFESSION_TYPE GetProfession();

protected:
	/**
	* Construction
	*
	* @param PROFESSION_TYPE eProfession
	* @return 
	*/
	Profession(PROFESSION_TYPE eProfession);


	/**
	* Operation
	*
	* @param PROFESSION_TYPE eProfession
	* @return
	*/
	VOID SetProfession(PROFESSION_TYPE eProfession);
private:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	Profession();

	/**
	* Copy Construction
	*
	* @param const Profession& cProfession
	* @return 
	*/
	Profession(const Profession& cProfession);

	/**
	* Assignment
	*
	* @param const Profession& cProfession
	* @return Profession&
	*/
	Profession& operator=(const Profession& cProfession);

public:
protected:
private:
	PROFESSION_TYPE m_eProfession;
};

class Warrior : public Profession
{
public:
	/**
	* Construction
	*
	* @param VOID
	* @return 
	*/
	Warrior();

	/**
	* Destruction
	*
	* @param VOID
	* @return 
	*/
	virtual ~Warrior();

	/**
	* Operation
	*
	* @param VOID
	* @return 
	*/
	virtual VOID Operation();

protected:
private:
	
	/**
	* Copy Construction
	*
	* @param const Warrior& cWarrior
	* @return 
	*/
	Warrior(const Warrior& cWarrior);

	/**
	* Assignment
	*
	* @param const Warrior& cWarrior
	* @return Warrior&
	*/
	Warrior& operator=(const Warrior& cWarrior);

public:
protected:
private:
};

class Master : public Profession
{
public:
	/**
	* Construction
	*
	* @param VOID
	* @return 
	*/
	Master();

	/**
	* Destruction
	*
	* @param VOID
	* @return 
	*/
	virtual ~Master();

	/**
	* Operation
	*
	* @param VOID
	* @return 
	*/
	virtual VOID Operation();

protected:
private:
	
	/**
	* Copy Construction
	*
	* @param const Master& cMaster
	* @return 
	*/
	Master(const Master& cMaster);

	/**
	* Assignment
	*
	* @param const Master& cMaster
	* @return Master&
	*/
	Master& operator=(const Master& cMaster);

public:
protected:
private:
};

class Priest : public Profession
{
public:
	/**
	* Construction
	*
	* @param VOID
	* @return
	*/
	Priest();

	/**
	* Destruction
	*
	* @param VOID
	* @return
	*/
	virtual ~Priest();

	/**
	* Operation
	*
	* @param VOID
	* @return
	*/
	virtual VOID Operation();

protected:
private:

	/**
	* Copy Construction
	*
	* @param const Priest& cPriest
	* @return
	*/
	Priest(const Priest& cPriest);

	/**
	* Assignment
	*
	* @param const Priest& cPriest
	* @return Priest&
	*/
	Priest& operator=(const Priest& cPriest);

public:
protected:
private:
};
#endif	/* >>CXX_DESIGNPATTERN_SINGLETON_H<< */
/* EOF */